package com.edu.leetcode.dataStruct;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.OptionalInt;

/**
 * 给定一组非负整数 nums，重新排列每个数的顺序（每个数不可拆分）使之组成一个最大的整数。
 * 注意：输出结果可能非常大，所以你需要返回一个字符串而不是整数。
 *
 * @作者 five-five
 * @创建时间 2021/4/12
 */
public class Demo18 {
    public static void main(String[] args) {
        Demo18 demo18 = new Demo18();
        String largestNumber = demo18.largestNumberSecondTry(new int[]{0, 0});
        System.out.println(largestNumber);
    }

    /**
     * 尝试使用新思路去解决数组元素组成最大值
     *
     * @param nums
     * @return
     */
    public String largestNumberSecondTry(int[] nums) {
        OptionalInt optionalInt = Arrays.stream(nums).max();
        boolean present = optionalInt.isPresent();
        int asInt = 1;
        if (present) {
            asInt = optionalInt.getAsInt();
        }
        if (asInt == 0) {
            return "0";
        }
        StringBuilder stringBuilder = new StringBuilder();
        List<Integer> integerList = this.intArrayToList(nums);
        integerList.sort((a, b) -> {
            String aStr = a.toString();
            String bStr = b.toString();
            long aVal = Long.parseLong(aStr + bStr);
            long bVal = Long.parseLong(bStr + aStr);
            return (int) (bVal - aVal);
        });
        integerList.forEach(stringBuilder::append);
        return stringBuilder.toString();
    }

    /**
     * 作者：LeetCode-Solution
     * 链接：https://leetcode-cn.com/problems/largest-number/solution/zui-da-shu-by-leetcode-solution-sid5/
     * 来源：力扣（LeetCode）
     * 著作权归作者所有。商业转载请联系作者获得授权，非商业转载请注明出处。
     *
     * @param nums
     * @return
     */
    public String largestNumberOffice(int[] nums) {
        int n = nums.length;
        // 转换成包装类型，以便传入 Comparator 对象（此处为 lambda 表达式）
        Integer[] numsArr = new Integer[n];
        for (int i = 0; i < n; i++) {
            numsArr[i] = nums[i];
        }

        Arrays.sort(numsArr, (x, y) -> {
            long sx = 10, sy = 10;
            while (sx <= x) {
                sx *= 10;
            }
            while (sy <= y) {
                sy *= 10;
            }
            return (int) (-sy * x - y + sx * y + x);
        });

        if (numsArr[0] == 0) {
            return "0";
        }
        StringBuilder ret = new StringBuilder();
        for (int num : numsArr) {
            ret.append(num);
        }
        return ret.toString();
    }

    /**
     * @param nums
     * @return
     */
    public String largestNumber(int[] nums) {
        StringBuilder sb = new StringBuilder();
        if (nums == null && nums.length != 0) {
            return null;
        }
        //把nums转变成Integer类型，这样可以直接写一个比较器实现
        List<Integer> integerList = intArrayToList(nums);
        integerList.sort((a, b) -> {
            //开始写排序逻辑，还会按照乘10的方法来
            //开始计算差了多少位
            int min = Math.min(a, b);
            int max = Math.max(a, b);
            int i = String.valueOf(max).length() - String.valueOf(min).length();
            double pow = Math.pow(10, i);
            int mintx = (int) (min * pow);
            if (mintx == max) {
                return 1;
            }
            if (min == a) {
                return max - mintx;
            } else {
                return b - a;
            }
        });
        integerList.forEach(sb::append);
        return sb.toString();
    }

    /**
     * 把int数组转换为Integer类型的集合
     *
     * @param nums
     * @return
     */
    private List<Integer> intArrayToList(int[] nums) {
        List<Integer> integerList = new ArrayList<>();
        for (int num : nums) {
            integerList.add(num);
        }
        return integerList;
    }

}
